﻿/*
SINACOR - BMF&Bovespa
Arquivo: FaixaAplicacao.cs
Criado em: 20-out-2009 11:30:59
Arquiteto Responsável: RAMelo.7Comm
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Linq;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation.BusinessRules;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{
    public class FaixaAplicacao : BaseBusinessLogic
    {
        #region Constantes de Erro

        private const int ERRO_OBJETO_NULO = 109516;

        #endregion

        #region Atributos

        ResourceAccess.FaixaAplicacao _raFaixaAplicacao = null;

        #endregion

        #region Construtores

        public FaixaAplicacao() : base() 
        {
            this._raFaixaAplicacao = new ResourceAccess.FaixaAplicacao();
        }

        #endregion

        #region ConsultarFaixasAplicacao

        /// <summary>
        /// Consulta faixas de aplicação conforme filtro
        /// </summary>
        /// <param name="parameter">Parâmetro para consultar faixa de aplicação</param>
        public List<BusinessEntity.FaixaAplicacao> ConsultarFaixasAplicacao(BusinessEntity.Parameter.FiltroFaixaAplicacao parameter)
        {
            List<BusinessEntity.FaixaAplicacao> listaFaixasAplicacoes = null;

            if (parameter != null)
            {
                listaFaixasAplicacoes = this._raFaixaAplicacao.ConsultarFaixasAplicacao(parameter);
            }
            else
            {
                throw new BusinessException(ERRO_OBJETO_NULO);
            }

            return listaFaixasAplicacoes;
        }

        #endregion

        #region DuplicarFaixaAplicacao

        /// <summary>
        /// Duplica as faixas de aplicação baseado em uma tabela de corretagem
        /// </summary>
        /// <param name="tabelaOrigem">Tabela Origem</param>
        /// <param name="tabelaDestino">Tabela Destino</param>
        public void DuplicarFaixaAplicacao(BusinessEntity.Parameter.FiltroTabelaCorretagemChave tabelaOrigem, ref BusinessEntity.TabelaCorretagem tabelaDestino)
        {
            List<BusinessEntity.FaixaAplicacao> listaFaixasAplicacoes = null;

            if (tabelaOrigem != null && tabelaDestino != null)
            {

                this._raFaixaAplicacao.DuplicarFaixasAplicacao(tabelaOrigem, new BusinessEntity.Parameter.FiltroTabelaCorretagemChave { Codigo = (tabelaDestino.Codigo.HasValue ? tabelaDestino.Codigo.Value : 0) });

                listaFaixasAplicacoes = this._raFaixaAplicacao.ConsultarFaixasAplicacao(new BusinessEntity.Parameter.FiltroFaixaAplicacao { CodigoTabela = tabelaDestino.Codigo });

                tabelaDestino.Faixas = listaFaixasAplicacoes;
            }
            else
            {
                throw new BusinessException(ERRO_OBJETO_NULO);
            }
        }

        #endregion

        #region ExcluirFaixaAplicacao

        /// <summary>
        /// Exclui uma faixa de aplicação de uma tabela de corretagem
        /// </summary>
        /// <param name="parameter">Parâmetro para excluir uma faixa de aplicação de uma tabela de corretagem</param>
        public void ExcluirFaixaAplicacao(BusinessEntity.Parameter.FiltroFaixaAplicacaoChave parameter)
        {
            if (parameter != null)
            {
                this._raFaixaAplicacao.ExcluirFaixaAplicacao(parameter);
            }
            else
            {
                throw new BusinessException(ERRO_OBJETO_NULO);
            }
        }

        #endregion

        #region ExcluirFaixasAplicacao

        /// <summary>
        /// Exclui uma lista de faixas de aplicação de uma tabela de corretagem
        /// </summary>
        /// <param name="listEntities">Parâmetro para excluir uma lista de faixas de aplicação de um tabela de corretagem</param>
        public void ExcluirFaixasAplicacao(List<BusinessEntity.Parameter.FiltroFaixaAplicacaoChave> listEntities)
        {
            foreach (BusinessEntity.Parameter.FiltroFaixaAplicacaoChave item in listEntities)
            {
                this.ExcluirFaixaAplicacao(item);
            }
        }

        #endregion

        #region ExcluirTodasFaixasAplicacao

        /// <summary>
        /// Exclui todas as faixas de corretagem de uma tabela de corretagem
        /// </summary>
        /// <Obs>
        /// Para excluir todas as faixas basta informar o codigo da tabela no filtro
        /// </Obs>
        /// <param name="parameter">Parâmetro para excluir todas as faixas de corretagem de uma tabela de corretagem</param>
        public void ExcluirTodasFaixasAplicacao(BusinessEntity.Parameter.FiltroFaixaAplicacaoChave parameter)
        {
            if (parameter.CodigoTabela != null)
            {
                this._raFaixaAplicacao.ExcluirTodasFaixasAplicacao(parameter);
            }
            else
            {
                throw new BusinessException(ERRO_OBJETO_NULO);
            }
        }

        #endregion

        #region ConsultarFaixasAplicacao

        /// <summary>
        /// Inclui uma faixa de aplicação para uma tabela de corretagem
        /// </summary>
        /// <param name="entity">Parâmetro para incluir uma faixa de aplicação para uma tabela de corretagem</param>
        public void IncluirFaixaAplicacao(BusinessEntity.FaixaAplicacao entity)
        {
            if (entity != null)
            {
                BusinessRuleValidation.ValidaInclusaoFaixaAplicacao validaInclusaoFaixaAplicacao = new BusinessRuleValidation.ValidaInclusaoFaixaAplicacao();
                validaInclusaoFaixaAplicacao.EntityToValidate = entity;

                BusinessRulesValidator validador = new BusinessRulesValidator();
                validador.AddValidation("ValidaInclusaoFaixaAplicacao", validaInclusaoFaixaAplicacao);

                validador.Validate();

                this._raFaixaAplicacao.IncluirFaixaAplicacao(entity);                
            }
            else
            {
                throw new BusinessException(ERRO_OBJETO_NULO);
            }
        }

        #endregion

        #region ConsultarFaixasAplicacao

        /// <summary>
        /// Inclui uma lista de faixas de aplicação para uma tabela de corretagem
        /// </summary>
        /// <param name="listEntities">Parâmetro para incluir uma lista de faixas de aplicação para uma tabela de corretagem</param>
        public void IncluirFaixasAplicacao(List<BusinessEntity.FaixaAplicacao> listEntities)
        {
            foreach (BusinessEntity.FaixaAplicacao item in listEntities)
            {
                if (item.Acao == BusinessEntity.Enum.AcaoFaixaAplicacao.Incluir)
                    this.IncluirFaixaAplicacao(item);
            }
        }

        #endregion

        #region ConsultarFaixasAplicacao

        /// <summary>
        /// Atualiza as faixas de aplicação de uma tabela de corretagem conforme sua ação
        /// </summary>
        /// <param name="listEntities">Parâmetro para atualizar as faixas de aplicação de uma tabela de corretagem</param>
        public void AtualizarFaixasAplicacao(List<BusinessEntity.FaixaAplicacao> listEntities)
        {
            List<BusinessEntity.Parameter.FiltroFaixaAplicacaoChave> faixasExclusao = null;
            List<BusinessEntity.FaixaAplicacao> faixasInclusao = null;

            if (listEntities != null && listEntities.Count > 0)
            {
                faixasExclusao = new List<BusinessEntity.Parameter.FiltroFaixaAplicacaoChave>();
                faixasInclusao = new List<BusinessEntity.FaixaAplicacao>();

                faixasExclusao = listEntities.Where(item => item.Acao == BusinessEntity.Enum.AcaoFaixaAplicacao.Excluir).Select<BusinessEntity.FaixaAplicacao, BusinessEntity.Parameter.FiltroFaixaAplicacaoChave>(item => new BusinessEntity.Parameter.FiltroFaixaAplicacaoChave { CodigoTabela = (item.CodigoTabela.HasValue ? item.CodigoTabela.Value : 0), TipoAplicacao = item.TipoAplicacao.IdentificadorBaseCalculo, Sequencia = item.NumeroSequencia }).ToList<BusinessEntity.Parameter.FiltroFaixaAplicacaoChave>();

                if (faixasExclusao.Count > 0)
                {
                    this.ExcluirFaixasAplicacao(faixasExclusao);
                }

                faixasInclusao = listEntities.Where(item => item.Acao == BusinessEntity.Enum.AcaoFaixaAplicacao.Incluir).ToList<BusinessEntity.FaixaAplicacao>();

                if (faixasInclusao.Count > 0)
                {
                    this.IncluirFaixasAplicacao(faixasInclusao);
                }
            }
        }

        #endregion
    }
}